#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

/*HJJ QQ479287006
 *给定一个经过编码的字符串，返回它解码后的字符串。

编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。

此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。

 

示例 1：

输入：s = "3[a]2[bc]"
输出："aaabcbc"
示例 2：

输入：s = "3[a2[c]]"
输出："accaccacc"
示例 3：

输入：s = "2[abc]3[cd]ef"
输出："abcabccdcdcdef"

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
string decodeString(string s) {
    int len = s.size();
    int num = 0;
    stack<int> numstack;
    stack <string> strstack;
    string cur = "";//cur 表示提取出来的字符串 也算临时记录也算记过记录
    for (int i = 0; i < len; ++i) {
        if (s[i] >= '0' && s[i] <= '9') {
            num = 10 * num + s[i] - '0';
        } else if (s[i] == '[') {//遇到有做号才压栈
            numstack.push(num);
            strstack.push(cur);
            num = 0;
            cur.clear(); //这里需要清空的 这里是开始记录括号里面的内容了 后面进行循环
        } else if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
            cur += s[i];
        else if (s[i] == ']') {   //右边括号出站
            //像这样出站基本不能为null

            int k = numstack.top();
            numstack.pop();
            for (int j = 0; j < k; ++j)
                strstack.top() += cur;
            cur = strstack.top();
            strstack.pop();

        }

    }

    return cur;
}


string decodeString(string s) {
    int len = s.size();
    int num = 0;
    stack<int> numstack;
    stack <string> strstack;
    string cur = "";

    for (int i = 0; i < len; i++) {
        if (s[i] >= 'a' && s[i] <= 'z') {
            cur = cur + s[i];

        } else if (s[i] == ']') {
            int k = numstack.top();
            numstack.pop();

            if (cur.size() == 0) {

                cur = strstack.top();
                strstack.pop();
            }

            for (int j = 0; j < k; j++) {
                strstack.top() = strstack.top() + cur; //把字符串搞到顶部
            }

            cur = strstack.top();//差的就是这个 把 这个赋值 然后弹出。。。。。
            strstack.pop();

            //cur.clear();
        } else if (s[i] >= '0' && s[i] <= '9') {

            num = num * 10 + (s[i] - '0');

        } else if (s[i] == '[') {
            numstack.push(num);
            strstack.push(cur);
            cur.clear();
            num = 0;
        }


    }

    string result = "";

    while (!strstack.empty()) {
        result = strstack.top() + result;
        strstack.pop();
    }

    return result + cur;
}